package com.skymxc.clickroute;

import android.app.Activity;
import android.util.Log;
import android.view.View;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.HashMap;

/**
 * <p>
 * 点击事件调用
 * 无论是 OnClickListener,OnLongClickListener 都可以调用
 * 切记不要混用，id 冲突的话 只保留最后一个
 * </p>
 *
 * @author 孟祥超
 * <p>
 * date: 2021/8/9
 */
public class ClickInvocationHandler implements InvocationHandler {
    private static final String TAG = "ClickInvocationHandler";
    private Activity activity;
    private HashMap<Integer,Method> idMethodMap = new HashMap<>();

    public ClickInvocationHandler(Activity activity) {
        this.activity = activity;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Log.i(TAG, "invoke: 开始执行->"+method.getName());
        //这里要找到那个真实的方法，怎么找，通过id最好找
        if (null==args||args.length==0) return null;// onClick 方法是有一个 View 参数的，没有的话说明不是代理的onViewClick 不处理
        Object arg = args[0];
        if (null==arg) return null;
        View view = (View) arg;
        if (!idMethodMap.containsKey(view.getId())){
            return null; // Activity 里没有绑定这个 View
        }
        Method realMethod = idMethodMap.get(view.getId());
        Log.i(TAG, "invoke: 找到那个声明的方法->"+realMethod.getName());
        Object invoke = realMethod.invoke(this.activity, args);
        Log.i(TAG, "invoke: 结束执行->"+realMethod.getName());
        return invoke;
    }

    public void addViewMethod(int id,Method method){
        idMethodMap.put(id,method);
    }
}
